/**
 *  @file
 *  @brief   无向无权图
 *  @author  wanghuan
 *  @date    2024.02.29
 *  @version  v1.0
 *  @par Copyright(c):  ShenGong  Simulation corporation
 */

#ifndef Algebra_Graph_h
#define Algebra_Graph_h

#include <vector>
#include "AlgebraModule.h"

SG_NAMESPACE_OPEN
namespace Algebra
{
    /// @brief 无向无权图
    ///
    /// 使用图描述拓扑连接关系，左闭右开区间[`m_neighbour[m_pointer[i]]`, `m_neighbour[m_pointer[i+1]]`)
    /// 描述第i个顶点拥有的邻居
    struct ALGEBRA_EXPORT Graph
    {
      public:
        Graph () = default;
        /** @brief < 通过每个顶点边数量，开辟图结构的内存空间
         *
         * 本构造函数对m_pointer完成赋值， 而 m_neighbour仅仅具有正确的数组大小，相邻关系需要进一步指定
         * @param edgeSizes 每个顶点具有的邻居数量
         */
        Graph (const std::vector<std::size_t>& edgeSizes);
        /// @brief 获得图中顶点数量
        std::size_t GetNodeSize () const;

      public:
        std::vector<std::size_t> m_pointer;    ///< 顶点对应边在m_neighbour中的索引区间
        std::vector<std::size_t> m_neighbour;  ///< 依次记录每个顶点的邻居（边）
    };

    inline std::size_t Graph::GetNodeSize () const
    {
        return m_pointer.size () - 1;
    }

};  // end namespace Algebra

SG_NAMESPACE_CLOSE

#endif  // Algebra_Graph_h